# 写 代码
#  看一遍之前自己写的代码
"""
三段式
·程序入口 开始 开关
· 自定义 类 函数 class  def 自定义  找到 对应的函数 实例  去找
· 导入  开始的布局

游戏设计 弹球游戏的需求  ：

借用已经封装好的 类， 借用工具 模块 , 动画模块tkinter , time , random （已经封装好的 类）

类：
    弹球
        初始化函数 （赋予的功能） 初始化的参数
        移动的函数
        #判断球拍打到弹球 再弹起  球拍打到球 运动 球
    球拍
        初始化函数 （赋予的功能） 初始化的参数
        移动的函数
    分数
        初始化函数 （赋予的功能） 初始化的参数
        分数变化的功能
游戏开始结束

写代码中 报错 怎么来 改代码 如何debug
80%  单词拼写
10%  英文输入法  缩进 对齐
 报错的检查方式
 出现红色波浪线  is not defined

碰撞 符号 大于 小于  运动状态 增大
                  静止状态
"""
import tkinter,time,random  # 导入 动画模块

class Ball():

    def __init__(self,canvas,paddle,score,color):
        self.canvas = canvas
        self.paddle = paddle
        self.score = score
        self.id = canvas.create_oval(0,0,50,50,fill = color)  # 创建球  大小
        self.canvas.move(self.id,400,200)

        self.x = 3
        self.y = 3
        self.hit_bottom = False
    def draw(self):
        pos = self.canvas.coords(self.id)   # pos = [x1,y1,x2,y2]  pos[0] = x1
        self.canvas.move(self.id, self.x, self.y)
        if pos[0] <= 0:
            self.x = 5
        if pos[2] >= 800:
            self.x = -5
        if pos[1] <= 0:
            self.y = 5
        if pos[3] >= 600:  # 当小球碰到底部的时候
        # 游戏停止值 == 真:
            self.hit_bottom = True
            # self.y = -5   # 往上弹
        if self.hit_paddle(pos) == True:
            self.y = -5
    def hit_paddle(self,pos):   # 让小球和球拍的坐标 进行 比对 判断 。  在小球这个类里 要把球拍 传进来
        paddle_pos = self.canvas.coords(self.paddle.id)     # 获取了球拍的坐标
        # 满足球拍击打到小球  满足水平和垂直方向 范围内 同时满足   # 水平 x1 x2
        # 小球的x2 大于球拍的x1 并且 球拍的x2　大于小球的x1
        if pos[2] >= paddle_pos[0] and paddle_pos[2] >= pos[0]:
            if pos[3] >= paddle_pos[1] and  paddle_pos[3] >= pos[3]:
                self.score.hit()
                self.x = self.paddle.x + self.x
                return True
        return False
            # 垂直方向 小球的y2 往下 移动 增大 到 球拍的y1, 球拍的y2  大于小球的y2




class Paddle():

    def __init__(self,canvas,color):
        self.canvas = canvas
        self.id = canvas.create_rectangle(0,0,500,50,fill = color)  # 创建 球拍的大小
        self.canvas.move(self.id,200,500)
        self.x = 3
        self.y = 0
        self.canvas.bind_all('<KeyPress-Left>',self.turn_left)# 监听所有左键  一旦按下左键 则执行 turn_left 函数
        self.canvas.bind_all('<KeyPress-Right>', self.turn_right)  # 监听所有左键  一旦按下右键 则执行 turn_right 函数
        self.canvas.bind_all('<KeyPress-F1>', self.start_game)
        self.start = False
    def start_game(self,evt):
        self.start = True
        self.canvas.itemconfig(game_start_text,state = 'hidden')

    def turn_left(self,evt):  # event evt 事件驱动
        self.x = -5
    def turn_right(self,evt):
        self.x = 5

    def draw(self):
        pos = self.canvas.coords(self.id)  # pos = [x1,y1,x2,y2]  pos[0] = x1
        self.canvas.move(self.id, self.x, self.y)
        if pos[0] <= 0:
            self.x = 5
        if pos[2] >= 800:
            self.x = -5
        if pos[1] <= 0:
            self.y = 5
        if pos[3] >= 600:
            self.y = -5
class Score():
    def __init__(self,canvas,color):
        self.score = 0
        self.canvas = canvas
        self.id = canvas.create_text(700,50,text = self.score, font = ("Arial",30),fill = color)   # 创建分数位置
    def hit(self):
        self.score += 1  # self.score = self.score +　1
        self.canvas.itemconfig(self.id, text = self.score)
tk = tkinter.Tk()  # 实例化动画
canvas = tkinter.Canvas(tk, width = 800, height = 600)  # canvas 会动的画布
tk.title("第二遍写")
#tk.wm_attributes('-topmost',1)
canvas.pack()
score = Score(canvas,"red")
paddle = Paddle(canvas,"blue")
ball = Ball(canvas,paddle,score,"red")

game_start_text = canvas.create_text(400,300,text = "按下F1 游戏开始", font = ("Arial",30))
game_over_text =  canvas.create_text(400,200,text = "game over", font = ("Arial",30),state = 'hidden')
while 1:
    if ball.hit_bottom == False  and  paddle.start == True: # 开始值  = True 当我按下开始的时候 才开始:
        ball.draw()
        paddle.draw()
    if ball.hit_bottom == True:
        canvas.itemconfig(game_over_text, state='normal')
    tk.update()
    tk.update_idletasks()
    time.sleep(0.01)



